<?php

namespace Yeelight\Models\Basic;

use Countries;

/**
 * Class CountryModel
 *
 * @category Yeelight
 *
 * @package Yeelight\Models\Basic
 *
 * @author Sheldon Lee <xdlee110@gmail.com>
 *
 * @license https://opensource.org/licenses/MIT MIT
 *
 * @link https://www.yeelight.com
 */
class CountryModel
{
    const COUNTRY_CHINA = 'CN';
    const COUNTRY_SINGAPORE = 'SG';
    const COUNTRY_UNITED_STATES = 'US';
    const CURRENT_USER_COUNTRY_KEY = 'Country.CurrentUser';

    public static $fallback_country = self::COUNTRY_UNITED_STATES;

    public static $all_available_countries = [
        self::COUNTRY_SINGAPORE,
        self::COUNTRY_CHINA,
        self::COUNTRY_UNITED_STATES,
    ];

    public static $nexmo_supported_country_calling_codes = [
        'AD' => '+376',
        'AE' => '+971',
        'AF' => '+93',
        'AG' => '+1268',
        'AI' => '+1264',
        'AL' => '+355',
        'AM' => '+374',
        'AO' => '+244',
        'AR' => '+54',
        'AT' => '+43',
        'AU' => '+61',
        'AW' => '+297',
        'AZ' => '+994',
        'BA' => '+387',
        'BB' => '+1246',
        'BD' => '+880',
        'BE' => '+32',
        'BF' => '+226',
        'BG' => '+359',
        'BH' => '+973',
        'BI' => '+257',
        'BJ' => '+229',
        'BM' => '+1441',
        'BN' => '+673',
        'BO' => '+591',
        'BQ' => '+599',
        'BR' => '+55',
        'BS' => '+1242',
        'BT' => '+975',
        'BW' => '+267',
        'BY' => '+375',
        'BZ' => '+501',
        'CA' => '+1',
        'CD' => '+243',
        'CF' => '+236',
        'CG' => '+242',
        'CH' => '+41',
        'CI' => '+225',
        'CK' => '+682',
        'CL' => '+56',
        'CM' => '+237',
        'CN' => '+86',
        'CO' => '+57',
        'CR' => '+506',
        'CU' => '+53',
        'CV' => '+238',
        'CW' => '+599',
        'CY' => '+357',
        'CZ' => '+420',
        'DE' => '+49',
        'DJ' => '+253',
        'DK' => '+45',
        'DM' => '+1767',
        'DO' => '+1809',
        'DZ' => '+213',
        'EC' => '+593',
        'EE' => '+372',
        'EG' => '+20',
        'ES' => '+34',
        'ET' => '+251',
        'FI' => '+358',
        'FJ' => '+679',
        'FO' => '+298',
        'FR' => '+33',
        'GA' => '+241',
        'GB' => '+44',
        'GD' => '+1473',
        'GE' => '+995',
        'GF' => '+594',
        'GH' => '+233',
        'GI' => '+350',
        'GL' => '+299',
        'GM' => '+220',
        'GN' => '+224',
        'GP' => '+590',
        'GQ' => '+240',
        'GR' => '+30',
        'GT' => '+502',
        'GU' => '+1671',
        'GW' => '+245',
        'GY' => '+592',
        'HK' => '+852',
        'HN' => '+504',
        'HR' => '+385',
        'HT' => '+509',
        'HU' => '+36',
        'ID' => '+62',
        'IE' => '+353',
        'IL' => '+972',
        'IN' => '+91',
        'IQ' => '+964',
        'IR' => '+98',
        'IS' => '+354',
        'IT' => '+39',
        'JM' => '+1876',
        'JO' => '+962',
        'JP' => '+81',
        'KE' => '+254',
        'KG' => '+996',
        'KH' => '+855',
        'KI' => '+686',
        'KM' => '+269',
        'KN' => '+1869',
        'KR' => '+82',
        'KW' => '+965',
        'KY' => '+1345',
        'KZ' => '+7',
        'LA' => '+856',
        'LB' => '+961',
        'LC' => '+1758',
        'LI' => '+423',
        'LK' => '+94',
        'LR' => '+231',
        'LS' => '+266',
        'LT' => '+370',
        'LU' => '+352',
        'LV' => '+371',
        'LY' => '+218',
        'MA' => '+212',
        'MC' => '+377',
        'MD' => '+373',
        'ME' => '+382',
        'MG' => '+261',
        'MK' => '+389',
        'ML' => '+223',
        'MM' => '+95',
        'MN' => '+976',
        'MO' => '+853',
        'MQ' => '+596',
        'MR' => '+222',
        'MS' => '+1664',
        'MT' => '+356',
        'MU' => '+230',
        'MV' => '+960',
        'MW' => '+265',
        'MX' => '+52',
        'MY' => '+60',
        'MZ' => '+258',
        'NA' => '+264',
        'NC' => '+687',
        'NE' => '+227',
        'NG' => '+234',
        'NI' => '+505',
        'NL' => '+31',
        'NO' => '+47',
        'NP' => '+977',
        'NZ' => '+64',
        'OM' => '+968',
        'PA' => '+507',
        'PE' => '+51',
        'PF' => '+689',
        'PG' => '+675',
        'PH' => '+63',
        'PK' => '+92',
        'PL' => '+48',
        'PM' => '+508',
        'PR' => '+1787',
        'PS' => '+970',
        'PT' => '+351',
        'PW' => '+680',
        'PY' => '+595',
        'QA' => '+974',
        'RE' => '+262',
        'RO' => '+40',
        'RS' => '+381',
        'RU' => '+7',
        'RW' => '+250',
        'SA' => '+966',
        'SB' => '+677',
        'SC' => '+248',
        'SD' => '+249',
        'SE' => '+46',
        'SG' => '+65',
        'SI' => '+386',
        'SK' => '+421',
        'SL' => '+232',
        'SM' => '+378',
        'SN' => '+221',
        'SO' => '+252',
        'SR' => '+597',
        'SS' => '+211',
        'ST' => '+239',
        'SV' => '+503',
        'SX' => '+1721',
        'SY' => '+963',
        'SZ' => '+268',
        'TC' => '+1649',
        'TD' => '+235',
        'TG' => '+228',
        'TH' => '+66',
        'TJ' => '+992',
        'TL' => '+670',
        'TM' => '+993',
        'TN' => '+216',
        'TO' => '+676',
        'TR' => '+90',
        'TT' => '+1868',
        'TW' => '+886',
        'TZ' => '+255',
        'UA' => '+380',
        'UG' => '+256',
        'US' => '+1',
        'UY' => '+598',
        'UZ' => '+998',
        'VC' => '+1784',
        'VE' => '+58',
        'VG' => '+1284',
        'VI' => '+1340',
        'VN' => '+84',
        'VU' => '+678',
        'WS' => '+685',
        'YE' => '+967',
        'YT' => '+269',
        'ZA' => '+27',
        'ZM' => '+260',
        'ZW' => '+263',
    ];

    public static $country_calling_codes = [
        'AF'   => '+93',
        'AX'   => '+358',
        'AL'   => '+355',
        'DZ'   => '+213',
        'AS'   => '+1',
        'AD'   => '+376',
        'AO'   => '+244',
        'AI'   => '+1',
        'AQ'   => '+672',
        'AG'   => '+1',
        'AR'   => '+54',
        'AM'   => '+374',
        'AW'   => '+297',
        'SH'   => '+247',
        'AU'   => '+61',
        'AT'   => '+43',
        'AZ'   => '+994',
        'BS'   => '+1',
        'BH'   => '+973',
        'BD'   => '+880',
        'BB'   => '+1',
        'BY'   => '+375',
        'BE'   => '+32',
        'BZ'   => '+501',
        'BJ'   => '+229',
        'BM'   => '+1',
        'BT'   => '+975',
        'BO'   => '+591',
        'BQ'   => '+599',
        'BA'   => '+387',
        'BW'   => '+267',
        'BV'   => '+47',
        'BR'   => '+55',
        'IO'   => '+246',
        'BN'   => '+673',
        'BG'   => '+359',
        'BF'   => '+226',
        'BI'   => '+257',
        'KH'   => '+855',
        'CM'   => '+237',
        'CA'   => '+1',
        'CV'   => '+238',
        'KY'   => '+1',
        'CF'   => '+236',
        'TD'   => '+235',
        'CL'   => '+56',
        'CN'   => '+86',
        'CX'   => '+61',
        'CC'   => '+891',
        'CO'   => '+57',
        'KM'   => '+269',
        'CD'   => '+243',
        'CG'   => '+242',
        'CK'   => '+682',
        'CR'   => '+506',
        'CI'   => '+225',
        'HR'   => '+385',
        'CU'   => '+53',
        'CW'   => '+599',
        'CY'   => '+357',
        'CZ'   => '+420',
        'DK'   => '+45',
        'DJ'   => '+253',
        'DM'   => '+1',
        'DO'   => '+1',
        'TL'   => '+670',
        'EC'   => '+593',
        'EG'   => '+20',
        'SV'   => '+503',
        'GQ'   => '+240',
        'ER'   => '+291',
        'EE'   => '+372',
        'ET'   => '+251',
        'FK'   => '+500',
        'FO'   => '+298',
        'FJ'   => '+679',
        'FI'   => '+358',
        'FR'   => '+33',
        'GF'   => '+594',
        'PF'   => '+689',
        'TF'   => '+262',
        'GA'   => '+241',
        'GM'   => '+220',
        'GE'   => '+995',
        'DE'   => '+49',
        'GH'   => '+233',
        'GI'   => '+350',
        'GR'   => '+30',
        'GL'   => '+299',
        'GD'   => '+1',
        'GP'   => '+590',
        'GU'   => '+1',
        'GT'   => '+502',
        'GG'   => '+44',
        'GN'   => '+224',
        'GW'   => '+245',
        'GY'   => '+592',
        'HT'   => '+509',
        'HM'   => '+61',
        'VA'   => '+379',
        'HN'   => '+504',
        'HK'   => '+852',
        'HU'   => '+36',
        'IS'   => '+354',
        'IN'   => '+91',
        'ID'   => '+62',
        'IQ'   => '+964',
        'IR'   => '+98',
        'IE'   => '+353',
        'IM'   => '+44',
        'IL'   => '+972',
        'IT'   => '+39',
        'JM'   => '+1',
        'JP'   => '+81',
        'JE'   => '+44',
        'JO'   => '+962',
        'KZ'   => '+7',
        'KE'   => '+254',
        'KI'   => '+686',
        'KP'   => '+850',
        'KR'   => '+82',
        'XK'   => '+377',
        'XK_2' => '381',
        'XK_3' => '386',
        'KW'   => '+965',
        'KG'   => '+996',
        'LA'   => '+856',
        'LV'   => '+371',
        'LB'   => '+961',
        'LS'   => '+266',
        'LR'   => '+231',
        'LY'   => '+218',
        'LI'   => '+423',
        'LT'   => '+370',
        'LU'   => '+352',
        'MO'   => '+853',
        'MK'   => '+389',
        'MG'   => '+261',
        'MW'   => '+265',
        'MY'   => '+60',
        'MV'   => '+960',
        'ML'   => '+223',
        'MT'   => '+356',
        'MH'   => '+692',
        'MQ'   => '+596',
        'MR'   => '+222',
        'MU'   => '+230',
        'YT'   => '+262',
        'MX'   => '+52',
        'FM'   => '+691',
        'MD'   => '+373',
        'MC'   => '+377',
        'MN'   => '+976',
        'ME'   => '+382',
        'MS'   => '+1',
        'MA'   => '+212',
        'MZ'   => '+258',
        'MM'   => '+95',
        'NA'   => '+264',
        'NR'   => '+674',
        'NL'   => '+31',
        'BQ'   => '+599',
        'NP'   => '+977',
        'NC'   => '+687',
        'NZ'   => '+64',
        'NI'   => '+505',
        'NE'   => '+227',
        'NG'   => '+234',
        'NU'   => '+683',
        'NF'   => '+672',
        'GB'   => '+44',
        'GB_2' => '+28',
        'MP'   => '+1',
        'NO'   => '+47',
        'OM'   => '+968',
        'PK'   => '+92',
        'PW'   => '+680',
        'PS'   => '+970',
        'PA'   => '+507',
        'PG'   => '+675',
        'PY'   => '+595',
        'PE'   => '+51',
        'PH'   => '+63',
        'PN'   => '+64',
        'PL'   => '+48',
        'PT'   => '+351',
        'PR'   => '+1',
        'QA'   => '+974',
        'RE'   => '+262',
        'RO'   => '+40',
        'RU'   => '+7',
        'RW'   => '+250',
        'BL'   => '+590',
        'SH'   => '+290',
        'KN'   => '+1',
        'LC'   => '+1',
        'MF'   => '+590',
        'PM'   => '+508',
        'VC'   => '+1',
        'WS'   => '+685',
        'SM'   => '+378',
        'ST'   => '+239',
        'SA'   => '+966',
        'SN'   => '+221',
        'RS'   => '+381',
        'SC'   => '+248',
        'SL'   => '+232',
        'SX'   => '+1',
        'SG'   => '+65',
        'SK'   => '+421',
        'SI'   => '+386',
        'SB'   => '+677',
        'SO'   => '+252',
        'ZA'   => '+27',
        'GS'   => '+500',
        'SS'   => '+211',
        'ES'   => '+34',
        'LK'   => '+94',
        'SD'   => '+249',
        'SR'   => '+597',
        'SJ'   => '+47',
        'SZ'   => '+268',
        'SE'   => '+46',
        'CH'   => '+41',
        'SY'   => '+963',
        'TW'   => '+886',
        'TJ'   => '+992',
        'TZ'   => '+255',
        'TH'   => '+66',
        'TL'   => '+670',
        'TG'   => '+228',
        'TK'   => '+690',
        'TO'   => '+676',
        'TT'   => '+1',
        'TN'   => '+216',
        'TR'   => '+90',
        'TM'   => '+993',
        'TC'   => '+1',
        'TV'   => '+688',
        'UG'   => '+256',
        'UA'   => '+380',
        'AE'   => '+971',
        'GB'   => '+44',
        'US'   => '+1',
        'UM'   => '+1',
        'UY'   => '+598',
        'UZ'   => '+998',
        'VU'   => '+678',
        'VE'   => '+58',
        'VN'   => '+84',
        'VG'   => '+1',
        'VI'   => '+1',
        'WF'   => '+681',
        'EH'   => '+212',
        'YE'   => '+967',
        'ZM'   => '+260',
        'ZW'   => '+263',
    ];

    public static $locale_calling_codes = [
        'sq'         => '阿尔巴尼亚文',
        'sq_AL'      => '阿尔巴尼亚文 (阿尔巴尼亚)',
        'sq_XK'      => '阿尔巴尼亚文 (科索沃)',
        'sq_MK'      => '阿尔巴尼亚文 (马其顿)',
        'ak'         => '阿肯文',
        'ak_GH'      => '阿肯文 (加纳)',
        'ar'         => '阿拉伯文',
        'ar_DZ'      => '阿拉伯文 (阿尔及利亚)',
        'ar_AE'      => '阿拉伯文 (阿拉伯联合酋长国)',
        'ar_OM'      => '阿拉伯文 (阿曼)',
        'ar_EG'      => '阿拉伯文 (埃及)',
        'ar_PS'      => '阿拉伯文 (巴勒斯坦领土)',
        'ar_BH'      => '阿拉伯文 (巴林)',
        'ar_ER'      => '阿拉伯文 (厄立特里亚)',
        'ar_DJ'      => '阿拉伯文 (吉布提)',
        'ar_QA'      => '阿拉伯文 (卡塔尔)',
        'ar_KM'      => '阿拉伯文 (科摩罗)',
        'ar_KW'      => '阿拉伯文 (科威特)',
        'ar_LB'      => '阿拉伯文 (黎巴嫩)',
        'ar_LY'      => '阿拉伯文 (利比亚)',
        'ar_MR'      => '阿拉伯文 (毛里塔尼亚)',
        'ar_MA'      => '阿拉伯文 (摩洛哥)',
        'ar_SS'      => '阿拉伯文 (南苏丹)',
        'ar_SA'      => '阿拉伯文 (沙特阿拉伯)',
        'ar_SD'      => '阿拉伯文 (苏丹)',
        'ar_SO'      => '阿拉伯文 (索马里)',
        'ar_TN'      => '阿拉伯文 (突尼斯)',
        'ar_EH'      => '阿拉伯文 (西撒哈拉)',
        'ar_SY'      => '阿拉伯文 (叙利亚)',
        'ar_YE'      => '阿拉伯文 (也门)',
        'ar_IQ'      => '阿拉伯文 (伊拉克)',
        'ar_IL'      => '阿拉伯文 (以色列)',
        'ar_JO'      => '阿拉伯文 (约旦)',
        'ar_TD'      => '阿拉伯文 (乍得)',
        'am'         => '阿姆哈拉文',
        'am_ET'      => '阿姆哈拉文 (埃塞俄比亚)',
        'as'         => '阿萨姆文',
        'as_IN'      => '阿萨姆文 (印度)',
        'az'         => '阿塞拜疆文',
        'az_AZ'      => '阿塞拜疆文 (阿塞拜疆)',
        'az_Latn_AZ' => '阿塞拜疆文 (拉丁文, 阿塞拜疆)',
        'az_Latn'    => '阿塞拜疆文 (拉丁文)',
        'az_Cyrl_AZ' => '阿塞拜疆文 (西里尔文, 阿塞拜疆)',
        'az_Cyrl'    => '阿塞拜疆文 (西里尔文)',
        'ee'         => '埃维文',
        'ee_TG'      => '埃维文 (多哥)',
        'ee_GH'      => '埃维文 (加纳)',
        'ga'         => '爱尔兰文',
        'ga_IE'      => '爱尔兰文 (爱尔兰)',
        'et'         => '爱沙尼亚文',
        'et_EE'      => '爱沙尼亚文 (爱沙尼亚)',
        'or'         => '奥里亚文',
        'or_IN'      => '奥里亚文 (印度)',
        'om'         => '奥洛莫文',
        'om_ET'      => '奥洛莫文 (埃塞俄比亚)',
        'om_KE'      => '奥洛莫文 (肯尼亚)',
        'os'         => '奥塞梯文',
        'os_RU'      => '奥塞梯文 (俄罗斯)',
        'os_GE'      => '奥塞梯文 (格鲁吉亚)',
        'eu'         => '巴斯克文',
        'eu_ES'      => '巴斯克文 (西班牙)',
        'be'         => '白俄罗斯文',
        'be_BY'      => '白俄罗斯文 (白俄罗斯)',
        'bm'         => '班巴拉文',
        'bm_Latn_ML' => '班巴拉文 (拉丁文, 马里)',
        'bm_Latn'    => '班巴拉文 (拉丁文)',
        'bg'         => '保加利亚文',
        'bg_BG'      => '保加利亚文 (保加利亚)',
        'nd'         => '北恩德贝勒文',
        'nd_ZW'      => '北恩德贝勒文 (津巴布韦)',
        'se'         => '北萨米文',
        'se_FI'      => '北萨米文 (芬兰)',
        'se_NO'      => '北萨米文 (挪威)',
        'se_SE'      => '北萨米文 (瑞典)',
        'is'         => '冰岛文',
        'is_IS'      => '冰岛文 (冰岛)',
        'pl'         => '波兰文',
        'pl_PL'      => '波兰文 (波兰)',
        'bs'         => '波斯尼亚文',
        'bs_BA'      => '波斯尼亚文 (波斯尼亚和黑塞哥维那)',
        'bs_Latn_BA' => '波斯尼亚文 (拉丁文, 波斯尼亚和黑塞哥维那)',
        'bs_Latn'    => '波斯尼亚文 (拉丁文)',
        'bs_Cyrl_BA' => '波斯尼亚文 (西里尔文, 波斯尼亚和黑塞哥维那)',
        'bs_Cyrl'    => '波斯尼亚文 (西里尔文)',
        'fa'         => '波斯文',
        'fa_AF'      => '波斯文 (阿富汗)',
        'fa_IR'      => '波斯文 (伊朗)',
        'dz'         => '不丹文',
        'dz_BT'      => '不丹文 (不丹)',
        'br'         => '布里多尼文',
        'br_FR'      => '布里多尼文 (法国)',
        'da'         => '丹麦文',
        'da_DK'      => '丹麦文 (丹麦)',
        'da_GL'      => '丹麦文 (格陵兰)',
        'de'         => '德文',
        'de_AT'      => '德文 (奥地利)',
        'de_BE'      => '德文 (比利时)',
        'de_DE'      => '德文 (德国)',
        'de_LI'      => '德文 (列支敦士登)',
        'de_LU'      => '德文 (卢森堡)',
        'de_CH'      => '德文 (瑞士)',
        'ru'         => '俄文',
        'ru_BY'      => '俄文 (白俄罗斯)',
        'ru_RU'      => '俄文 (俄罗斯)',
        'ru_KZ'      => '俄文 (哈萨克斯坦)',
        'ru_KG'      => '俄文 (吉尔吉斯斯坦)',
        'ru_MD'      => '俄文 (摩尔多瓦)',
        'ru_UA'      => '俄文 (乌克兰)',
        'fo'         => '法罗文',
        'fo_FO'      => '法罗文 (法罗群岛)',
        'fr'         => '法文',
        'fr_DZ'      => '法文 (阿尔及利亚)',
        'fr_BJ'      => '法文 (贝宁)',
        'fr_BE'      => '法文 (比利时)',
        'fr_BF'      => '法文 (布基纳法索)',
        'fr_BI'      => '法文 (布隆迪)',
        'fr_GQ'      => '法文 (赤道几内亚)',
        'fr_TG'      => '法文 (多哥)',
        'fr_FR'      => '法文 (法国)',
        'fr_PF'      => '法文 (法属波利尼西亚)',
        'fr_GF'      => '法文 (法属圭亚那)',
        'fr_MF'      => '法文 (法属圣马丁)',
        'fr_CG'      => '法文 (刚果（布）)',
        'fr_CD'      => '法文 (刚果（金）)',
        'fr_GP'      => '法文 (瓜德罗普)',
        'fr_HT'      => '法文 (海地)',
        'fr_DJ'      => '法文 (吉布提)',
        'fr_GN'      => '法文 (几内亚)',
        'fr_CA'      => '法文 (加拿大)',
        'fr_GA'      => '法文 (加蓬)',
        'fr_CM'      => '法文 (喀麦隆)',
        'fr_KM'      => '法文 (科摩罗)',
        'fr_CI'      => '法文 (科特迪瓦)',
        'fr_RE'      => '法文 (留尼汪)',
        'fr_LU'      => '法文 (卢森堡)',
        'fr_RW'      => '法文 (卢旺达)',
        'fr_MG'      => '法文 (马达加斯加)',
        'fr_ML'      => '法文 (马里)',
        'fr_MQ'      => '法文 (马提尼克)',
        'fr_YT'      => '法文 (马约特)',
        'fr_MU'      => '法文 (毛里求斯)',
        'fr_MR'      => '法文 (毛里塔尼亚)',
        'fr_MA'      => '法文 (摩洛哥)',
        'fr_MC'      => '法文 (摩纳哥)',
        'fr_NE'      => '法文 (尼日尔)',
        'fr_CH'      => '法文 (瑞士)',
        'fr_SN'      => '法文 (塞内加尔)',
        'fr_SC'      => '法文 (塞舌尔)',
        'fr_BL'      => '法文 (圣巴泰勒米)',
        'fr_PM'      => '法文 (圣皮埃尔和密克隆群岛)',
        'fr_TN'      => '法文 (突尼斯)',
        'fr_WF'      => '法文 (瓦利斯和富图纳)',
        'fr_VU'      => '法文 (瓦努阿图)',
        'fr_NC'      => '法文 (新喀里多尼亚)',
        'fr_SY'      => '法文 (叙利亚)',
        'fr_TD'      => '法文 (乍得)',
        'fr_CF'      => '法文 (中非共和国)',
        'fi'         => '芬兰文',
        'fi_FI'      => '芬兰文 (芬兰)',
        'ff'         => '夫拉文',
        'ff_GN'      => '夫拉文 (几内亚)',
        'ff_CM'      => '夫拉文 (喀麦隆)',
        'ff_MR'      => '夫拉文 (毛里塔尼亚)',
        'ff_SN'      => '夫拉文 (塞内加尔)',
        'qu'         => '盖丘亚文',
        'qu_BO'      => '盖丘亚文 (玻利维亚)',
        'qu_EC'      => '盖丘亚文 (厄瓜多尔)',
        'qu_PE'      => '盖丘亚文 (秘鲁)',
        'km'         => '高棉文',
        'km_KH'      => '高棉文 (柬埔寨)',
        'kl'         => '格陵兰文',
        'kl_GL'      => '格陵兰文 (格陵兰)',
        'ka'         => '格鲁吉亚文',
        'ka_GE'      => '格鲁吉亚文 (格鲁吉亚)',
        'gu'         => '古吉拉特文',
        'gu_IN'      => '古吉拉特文 (印度)',
        'kk'         => '哈萨克文',
        'kk_KZ'      => '哈萨克文 (哈萨克斯坦)',
        'kk_Cyrl_KZ' => '哈萨克文 (西里尔文, 哈萨克斯坦)',
        'kk_Cyrl'    => '哈萨克文 (西里尔文)',
        'ko'         => '韩文',
        'ko_KP'      => '韩文 (朝鲜)',
        'ko_KR'      => '韩文 (韩国)',
        'ha'         => '豪萨文',
        'ha_GH'      => '豪萨文 (加纳)',
        'ha_Latn_GH' => '豪萨文 (拉丁文, 加纳)',
        'ha_Latn_NE' => '豪萨文 (拉丁文, 尼日尔)',
        'ha_Latn_NG' => '豪萨文 (拉丁文, 尼日利亚)',
        'ha_Latn'    => '豪萨文 (拉丁文)',
        'ha_NE'      => '豪萨文 (尼日尔)',
        'ha_NG'      => '豪萨文 (尼日利亚)',
        'nl'         => '荷兰文',
        'nl_AW'      => '荷兰文 (阿鲁巴)',
        'nl_BE'      => '荷兰文 (比利时)',
        'nl_NL'      => '荷兰文 (荷兰)',
        'nl_BQ'      => '荷兰文 (荷兰加勒比区)',
        'nl_SX'      => '荷兰文 (荷属圣马丁)',
        'nl_CW'      => '荷兰文 (库拉索)',
        'nl_SR'      => '荷兰文 (苏里南)',
        'rn'         => '基隆迪文',
        'rn_BI'      => '基隆迪文 (布隆迪)',
        'ky'         => '吉尔吉斯文',
        'ky_KG'      => '吉尔吉斯文 (吉尔吉斯斯坦)',
        'ky_Cyrl_KG' => '吉尔吉斯文 (西里尔文, 吉尔吉斯斯坦)',
        'ky_Cyrl'    => '吉尔吉斯文 (西里尔文)',
        'ki'         => '吉库尤文',
        'ki_KE'      => '吉库尤文 (肯尼亚)',
        'gl'         => '加利西亚文',
        'gl_ES'      => '加利西亚文 (西班牙)',
        'ca'         => '加泰罗尼亚文',
        'ca_AD'      => '加泰罗尼亚文 (安道尔)',
        'ca_FR'      => '加泰罗尼亚文 (法国)',
        'ca_ES'      => '加泰罗尼亚文 (西班牙)',
        'ca_IT'      => '加泰罗尼亚文 (意大利)',
        'cs'         => '捷克文',
        'cs_CZ'      => '捷克文 (捷克共和国)',
        'kn'         => '卡纳达文',
        'kn_IN'      => '卡纳达文 (印度)',
        'kw'         => '凯尔特文',
        'kw_GB'      => '凯尔特文 (英国)',
        'hr'         => '克罗地亚文',
        'hr_BA'      => '克罗地亚文 (波斯尼亚和黑塞哥维那)',
        'hr_HR'      => '克罗地亚文 (克罗地亚)',
        'ks'         => '克什米尔文',
        'ks_Arab_IN' => '克什米尔文 (阿拉伯文, 印度)',
        'ks_Arab'    => '克什米尔文 (阿拉伯文)',
        'ks_IN'      => '克什米尔文 (印度)',
        'lv'         => '拉脱维亚文',
        'lv_LV'      => '拉脱维亚文 (拉脱维亚)',
        'lo'         => '老挝文',
        'lo_LA'      => '老挝文 (老挝)',
        'lt'         => '立陶宛文',
        'lt_LT'      => '立陶宛文 (立陶宛)',
        'ln'         => '林加拉文',
        'ln_AO'      => '林加拉文 (安哥拉)',
        'ln_CG'      => '林加拉文 (刚果（布）)',
        'ln_CD'      => '林加拉文 (刚果（金）)',
        'ln_CF'      => '林加拉文 (中非共和国)',
        'lg'         => '卢干达文',
        'lg_UG'      => '卢干达文 (乌干达)',
        'lb'         => '卢森堡文',
        'lb_LU'      => '卢森堡文 (卢森堡)',
        'rw'         => '卢旺达文',
        'rw_RW'      => '卢旺达文 (卢旺达)',
        'lu'         => '鲁巴加丹加文',
        'lu_CD'      => '鲁巴加丹加文 (刚果（金）)',
        'ro'         => '罗马尼亚文',
        'ro_RO'      => '罗马尼亚文 (罗马尼亚)',
        'ro_MD'      => '罗马尼亚文 (摩尔多瓦)',
        'rm'         => '罗曼什文',
        'rm_CH'      => '罗曼什文 (瑞士)',
        'gv'         => '马恩岛文',
        'gv_IM'      => '马恩岛文 (曼岛)',
        'mg'         => '马尔加什文',
        'mg_MG'      => '马尔加什文 (马达加斯加)',
        'mt'         => '马耳他文',
        'mt_MT'      => '马耳他文 (马耳他)',
        'mr'         => '马拉地文',
        'mr_IN'      => '马拉地文 (印度)',
        'ml'         => '马拉雅拉姆文',
        'ml_IN'      => '马拉雅拉姆文 (印度)',
        'ms'         => '马来文',
        'ms_Latn_MY' => '马来文 (拉丁文, 马来西亚)',
        'ms_Latn_BN' => '马来文 (拉丁文, 文莱)',
        'ms_Latn_SG' => '马来文 (拉丁文, 新加坡)',
        'ms_Latn'    => '马来文 (拉丁文)',
        'ms_MY'      => '马来文 (马来西亚)',
        'ms_BN'      => '马来文 (文莱)',
        'ms_SG'      => '马来文 (新加坡)',
        'mk'         => '马其顿文',
        'mk_MK'      => '马其顿文 (马其顿)',
        'mn'         => '蒙古文',
        'mn_MN'      => '蒙古文 (蒙古)',
        'mn_Cyrl_MN' => '蒙古文 (西里尔文, 蒙古)',
        'mn_Cyrl'    => '蒙古文 (西里尔文)',
        'bn'         => '孟加拉文',
        'bn_BD'      => '孟加拉文 (孟加拉国)',
        'bn_IN'      => '孟加拉文 (印度)',
        'my'         => '缅甸文',
        'my_MM'      => '缅甸文 (缅甸)',
        'af'         => '南非荷兰文',
        'af_NA'      => '南非荷兰文 (纳米比亚)',
        'af_ZA'      => '南非荷兰文 (南非)',
        'ne'         => '尼泊尔文',
        'ne_NP'      => '尼泊尔文 (尼泊尔)',
        'ne_IN'      => '尼泊尔文 (印度)',
        'nb'         => '挪威博克马尔文',
        'nb_NO'      => '挪威博克马尔文 (挪威)',
        'nb_SJ'      => '挪威博克马尔文 (斯瓦尔巴特和扬马延)',
        'nn'         => '挪威尼诺斯克文',
        'nn_NO'      => '挪威尼诺斯克文 (挪威)',
        'no'         => '挪威文',
        'no_NO'      => '挪威文 (挪威)',
        'pa'         => '旁遮普文',
        'pa_Arab_PK' => '旁遮普文 (阿拉伯文, 巴基斯坦)',
        'pa_Arab'    => '旁遮普文 (阿拉伯文)',
        'pa_PK'      => '旁遮普文 (巴基斯坦)',
        'pa_Guru_IN' => '旁遮普文 (果鲁穆奇文, 印度)',
        'pa_Guru'    => '旁遮普文 (果鲁穆奇文)',
        'pa_IN'      => '旁遮普文 (印度)',
        'pt'         => '葡萄牙文',
        'pt_AO'      => '葡萄牙文 (安哥拉)',
        'pt_BR'      => '葡萄牙文 (巴西)',
        'pt_TL'      => '葡萄牙文 (东帝汶)',
        'pt_CV'      => '葡萄牙文 (佛得角)',
        'pt_GW'      => '葡萄牙文 (几内亚比绍)',
        'pt_MZ'      => '葡萄牙文 (莫桑比克)',
        'pt_PT'      => '葡萄牙文 (葡萄牙)',
        'pt_ST'      => '葡萄牙文 (圣多美和普林西比)',
        'pt_MO'      => '葡萄牙文 (中国澳门特别行政区)',
        'ps'         => '普什图文',
        'ps_AF'      => '普什图文 (阿富汗)',
        'ja'         => '日文',
        'ja_JP'      => '日文 (日本)',
        'sv'         => '瑞典文',
        'sv_AX'      => '瑞典文 (奥兰群岛)',
        'sv_FI'      => '瑞典文 (芬兰)',
        'sv_SE'      => '瑞典文 (瑞典)',
        'sh'         => '塞尔维亚-克罗地亚文',
        'sh_BA'      => '塞尔维亚-克罗地亚文 (波斯尼亚和黑塞哥维那)',
        'sr'         => '塞尔维亚文',
        'sr_BA'      => '塞尔维亚文 (波斯尼亚和黑塞哥维那)',
        'sr_ME'      => '塞尔维亚文 (黑山共和国)',
        'sr_XK'      => '塞尔维亚文 (科索沃)',
        'sr_Latn_BA' => '塞尔维亚文 (拉丁文, 波斯尼亚和黑塞哥维那)',
        'sr_Latn_ME' => '塞尔维亚文 (拉丁文, 黑山共和国)',
        'sr_Latn_XK' => '塞尔维亚文 (拉丁文, 科索沃)',
        'sr_Latn_RS' => '塞尔维亚文 (拉丁文, 塞尔维亚)',
        'sr_Latn'    => '塞尔维亚文 (拉丁文)',
        'sr_RS'      => '塞尔维亚文 (塞尔维亚)',
        'sr_Cyrl_BA' => '塞尔维亚文 (西里尔文, 波斯尼亚和黑塞哥维那)',
        'sr_Cyrl_ME' => '塞尔维亚文 (西里尔文, 黑山共和国)',
        'sr_Cyrl_XK' => '塞尔维亚文 (西里尔文, 科索沃)',
        'sr_Cyrl_RS' => '塞尔维亚文 (西里尔文, 塞尔维亚)',
        'sr_Cyrl'    => '塞尔维亚文 (西里尔文)',
        'sg'         => '桑戈文',
        'sg_CF'      => '桑戈文 (中非共和国)',
        'si'         => '僧伽罗文',
        'si_LK'      => '僧伽罗文 (斯里兰卡)',
        'sn'         => '绍纳文',
        'sn_ZW'      => '绍纳文 (津巴布韦)',
        'eo'         => '世界文',
        'sk'         => '斯洛伐克文',
        'sk_SK'      => '斯洛伐克文 (斯洛伐克)',
        'sl'         => '斯洛文尼亚文',
        'sl_SI'      => '斯洛文尼亚文 (斯洛文尼亚)',
        'sw'         => '斯瓦希里文',
        'sw_KE'      => '斯瓦希里文 (肯尼亚)',
        'sw_TZ'      => '斯瓦希里文 (坦桑尼亚)',
        'sw_UG'      => '斯瓦希里文 (乌干达)',
        'ii'         => '四川彝文',
        'ii_CN'      => '四川彝文 (中国)',
        'gd'         => '苏格兰盖尔文',
        'gd_GB'      => '苏格兰盖尔文 (英国)',
        'so'         => '索马里文',
        'so_ET'      => '索马里文 (埃塞俄比亚)',
        'so_DJ'      => '索马里文 (吉布提)',
        'so_KE'      => '索马里文 (肯尼亚)',
        'so_SO'      => '索马里文 (索马里)',
        'tl'         => '塔加洛文',
        'tl_PH'      => '塔加洛文 (菲律宾)',
        'te'         => '泰卢固文',
        'te_IN'      => '泰卢固文 (印度)',
        'ta'         => '泰米尔文',
        'ta_MY'      => '泰米尔文 (马来西亚)',
        'ta_LK'      => '泰米尔文 (斯里兰卡)',
        'ta_SG'      => '泰米尔文 (新加坡)',
        'ta_IN'      => '泰米尔文 (印度)',
        'th'         => '泰文',
        'th_TH'      => '泰文 (泰国)',
        'to'         => '汤加文',
        'to_TO'      => '汤加文 (汤加)',
        'ti'         => '提格里尼亚文',
        'ti_ET'      => '提格里尼亚文 (埃塞俄比亚)',
        'ti_ER'      => '提格里尼亚文 (厄立特里亚)',
        'tr'         => '土耳其文',
        'tr_CY'      => '土耳其文 (塞浦路斯)',
        'tr_TR'      => '土耳其文 (土耳其)',
        'cy'         => '威尔士文',
        'cy_GB'      => '威尔士文 (英国)',
        'ug'         => '维吾尔文',
        'ug_Arab_CN' => '维吾尔文 (阿拉伯文, 中国)',
        'ug_Arab'    => '维吾尔文 (阿拉伯文)',
        'ug_CN'      => '维吾尔文 (中国)',
        'ur'         => '乌尔都文',
        'ur_PK'      => '乌尔都文 (巴基斯坦)',
        'ur_IN'      => '乌尔都文 (印度)',
        'uk'         => '乌克兰文',
        'uk_UA'      => '乌克兰文 (乌克兰)',
        'uz'         => '乌兹别克文',
        'uz_AF'      => '乌兹别克文 (阿富汗)',
        'uz_Arab_AF' => '乌兹别克文 (阿拉伯文, 阿富汗)',
        'uz_Arab'    => '乌兹别克文 (阿拉伯文)',
        'uz_Latn_UZ' => '乌兹别克文 (拉丁文, 乌兹别克斯坦)',
        'uz_Latn'    => '乌兹别克文 (拉丁文)',
        'uz_UZ'      => '乌兹别克文 (乌兹别克斯坦)',
        'uz_Cyrl_UZ' => '乌兹别克文 (西里尔文, 乌兹别克斯坦)',
        'uz_Cyrl'    => '乌兹别克文 (西里尔文)',
        'he'         => '希伯来文',
        'he_IL'      => '希伯来文 (以色列)',
        'el'         => '希腊文',
        'el_CY'      => '希腊文 (塞浦路斯)',
        'el_GR'      => '希腊文 (希腊)',
        'es'         => '西班牙文',
        'es_AR'      => '西班牙文 (阿根廷)',
        'es_PY'      => '西班牙文 (巴拉圭)',
        'es_PA'      => '西班牙文 (巴拿马)',
        'es_PR'      => '西班牙文 (波多黎各)',
        'es_BO'      => '西班牙文 (玻利维亚)',
        'es_GQ'      => '西班牙文 (赤道几内亚)',
        'es_DO'      => '西班牙文 (多米尼加共和国)',
        'es_EC'      => '西班牙文 (厄瓜多尔)',
        'es_PH'      => '西班牙文 (菲律宾)',
        'es_CO'      => '西班牙文 (哥伦比亚)',
        'es_CR'      => '西班牙文 (哥斯达黎加)',
        'es_CU'      => '西班牙文 (古巴)',
        'es_HN'      => '西班牙文 (洪都拉斯)',
        'es_IC'      => '西班牙文 (加纳利群岛)',
        'es_US'      => '西班牙文 (美国)',
        'es_PE'      => '西班牙文 (秘鲁)',
        'es_MX'      => '西班牙文 (墨西哥)',
        'es_NI'      => '西班牙文 (尼加拉瓜)',
        'es_SV'      => '西班牙文 (萨尔瓦多)',
        'es_GT'      => '西班牙文 (危地马拉)',
        'es_VE'      => '西班牙文 (委内瑞拉)',
        'es_UY'      => '西班牙文 (乌拉圭)',
        'es_ES'      => '西班牙文 (西班牙)',
        'es_EA'      => '西班牙文 (休达及梅利利亚)',
        'es_CL'      => '西班牙文 (智利)',
        'fy'         => '西弗里西亚文',
        'fy_NL'      => '西弗里西亚文 (荷兰)',
        'hu'         => '匈牙利文',
        'hu_HU'      => '匈牙利文 (匈牙利)',
        'hy'         => '亚美尼亚文',
        'hy_AM'      => '亚美尼亚文 (亚美尼亚)',
        'ig'         => '伊布文',
        'ig_NG'      => '伊布文 (尼日利亚)',
        'yi'         => '依地文',
        'it'         => '意大利文',
        'it_CH'      => '意大利文 (瑞士)',
        'it_SM'      => '意大利文 (圣马力诺)',
        'it_IT'      => '意大利文 (意大利)',
        'hi'         => '印地文',
        'hi_IN'      => '印地文 (印度)',
        'id'         => '印度尼西亚文',
        'id_ID'      => '印度尼西亚文 (印度尼西亚)',
        'en'         => '英文',
        'en_IE'      => '英文 (爱尔兰)',
        'en_AI'      => '英文 (安圭拉)',
        'en_AG'      => '英文 (安提瓜和巴布达)',
        'en_AU'      => '英文 (澳大利亚)',
        'en_BB'      => '英文 (巴巴多斯)',
        'en_PG'      => '英文 (巴布亚新几内亚)',
        'en_BS'      => '英文 (巴哈马)',
        'en_PK'      => '英文 (巴基斯坦)',
        'en_BM'      => '英文 (百慕大)',
        'en_MP'      => '英文 (北马里亚纳群岛)',
        'en_BE'      => '英文 (比利时)',
        'en_PR'      => '英文 (波多黎各)',
        'en_BZ'      => '英文 (伯利兹)',
        'en_BW'      => '英文 (博茨瓦纳)',
        'en_DG'      => '英文 (迪戈加西亚岛)',
        'en_DM'      => '英文 (多米尼克)',
        'en_ER'      => '英文 (厄立特里亚)',
        'en_PH'      => '英文 (菲律宾)',
        'en_FJ'      => '英文 (斐济)',
        'en_FK'      => '英文 (福克兰群岛)',
        'en_GM'      => '英文 (冈比亚)',
        'en_GD'      => '英文 (格林纳达)',
        'en_GG'      => '英文 (根西岛)',
        'en_GU'      => '英文 (关岛)',
        'en_GY'      => '英文 (圭亚那)',
        'en_SX'      => '英文 (荷属圣马丁)',
        'en_KI'      => '英文 (基里巴斯)',
        'en_CA'      => '英文 (加拿大)',
        'en_GH'      => '英文 (加纳)',
        'en_ZW'      => '英文 (津巴布韦)',
        'en_CM'      => '英文 (喀麦隆)',
        'en_KY'      => '英文 (开曼群岛)',
        'en_CC'      => '英文 (科科斯（基林）群岛)',
        'en_KE'      => '英文 (肯尼亚)',
        'en_CK'      => '英文 (库克群岛)',
        'en_LS'      => '英文 (莱索托)',
        'en_LR'      => '英文 (利比里亚)',
        'en_RW'      => '英文 (卢旺达)',
        'en_MG'      => '英文 (马达加斯加)',
        'en_MT'      => '英文 (马耳他)',
        'en_MW'      => '英文 (马拉维)',
        'en_MY'      => '英文 (马来西亚)',
        'en_MH'      => '英文 (马绍尔群岛)',
        'en_IM'      => '英文 (曼岛)',
        'en_MU'      => '英文 (毛里求斯)',
        'en_US'      => '英文 (美国)',
        'en_UM'      => '英文 (美国本土外小岛屿)',
        'en_AS'      => '英文 (美属萨摩亚)',
        'en_VI'      => '英文 (美属维京群岛)',
        'en_MS'      => '英文 (蒙特塞拉特)',
        'en_FM'      => '英文 (密克罗尼西亚)',
        'en_NA'      => '英文 (纳米比亚)',
        'en_ZA'      => '英文 (南非)',
        'en_SS'      => '英文 (南苏丹)',
        'en_NR'      => '英文 (瑙鲁)',
        'en_NG'      => '英文 (尼日利亚)',
        'en_NU'      => '英文 (纽埃)',
        'en_NF'      => '英文 (诺福克岛)',
        'en_PW'      => '英文 (帕劳)',
        'en_PN'      => '英文 (皮特凯恩群岛)',
        'en_WS'      => '英文 (萨摩亚)',
        'en_SL'      => '英文 (塞拉利昂)',
        'en_SC'      => '英文 (塞舌尔)',
        'en_CX'      => '英文 (圣诞岛)',
        'en_SH'      => '英文 (圣赫勒拿)',
        'en_KN'      => '英文 (圣基茨和尼维斯)',
        'en_LC'      => '英文 (圣卢西亚)',
        'en_VC'      => '英文 (圣文森特和格林纳丁斯)',
        'en_SZ'      => '英文 (斯威士兰)',
        'en_SD'      => '英文 (苏丹)',
        'en_SB'      => '英文 (所罗门群岛)',
        'en_TZ'      => '英文 (坦桑尼亚)',
        'en_TO'      => '英文 (汤加)',
        'en_TC'      => '英文 (特克斯和凯科斯群岛)',
        'en_TT'      => '英文 (特立尼达和多巴哥)',
        'en_TV'      => '英文 (图瓦卢)',
        'en_TK'      => '英文 (托克劳)',
        'en_VU'      => '英文 (瓦努阿图)',
        'en_UG'      => '英文 (乌干达)',
        'en_SG'      => '英文 (新加坡)',
        'en_NZ'      => '英文 (新西兰)',
        'en_JM'      => '英文 (牙买加)',
        'en_IN'      => '英文 (印度)',
        'en_GB'      => '英文 (英国)',
        'en_VG'      => '英文 (英属维京群岛)',
        'en_IO'      => '英文 (英属印度洋领地)',
        'en_ZM'      => '英文 (赞比亚)',
        'en_JE'      => '英文 (泽西岛)',
        'en_GI'      => '英文 (直布罗陀)',
        'en_MO'      => '英文 (中国澳门特别行政区)',
        'en_HK'      => '英文 (中国香港特别行政区)',
        'yo'         => '约鲁巴文',
        'yo_BJ'      => '约鲁巴文 (贝宁)',
        'yo_NG'      => '约鲁巴文 (尼日利亚)',
        'vi'         => '越南文',
        'vi_VN'      => '越南文 (越南)',
        'bo'         => '藏文',
        'bo_IN'      => '藏文 (印度)',
        'bo_CN'      => '藏文 (中国)',
        'zh'         => '中文',
        'zh_Hant_TW' => '中文 (繁体中文, 台湾)',
        'zh_Hant_MO' => '中文 (繁体中文, 中国澳门特别行政区)',
        'zh_Hant_HK' => '中文 (繁体中文, 中国香港特别行政区)',
        'zh_Hant'    => '中文 (繁体中文)',
        'zh_Hans_SG' => '中文 (简体中文, 新加坡)',
        'zh_Hans_CN' => '中文 (简体中文, 中国)',
        'zh_Hans_MO' => '中文 (简体中文, 中国澳门特别行政区)',
        'zh_Hans_HK' => '中文 (简体中文, 中国香港特别行政区)',
        'zh_Hans'    => '中文 (简体中文)',
        'zh_TW'      => '中文 (台湾)',
        'zh_SG'      => '中文 (新加坡)',
        'zh_CN'      => '中文 (中国)',
        'zh_MO'      => '中文 (中国澳门特别行政区)',
        'zh_HK'      => '中文 (中国香港特别行政区)',
        'zu'         => '祖鲁文',
        'zu_ZA'      => '祖鲁文 (南非)',
    ];

    public static function countriesToString(array $countries)
    {
        if (empty($countries)) {
            return '';
        }

        return implode(',', $countries);
    }

    public static function countriesFromString($countries_string)
    {
        if (empty($countries_string)) {
            return [];
        }

        return explode(',', $countries_string);
    }

    public static function getCountryList(array $countries = null, $locale = 'en')
    {
        $country_list = Countries::getList($locale, 'php', 'cldr');

        if (empty($countries)) {
            return $country_list;
        } else {
            return array_intersect_key($country_list, array_flip($countries));
        }
    }

    public static function getCountryISOCodeList()
    {
        $country_list = self::getCountryList();
        $country_iso_list = array_keys($country_list);

        return $country_iso_list;
    }

    public static function getLocalizedCountryList(array $countries = null)
    {
        $locale = 'en';
        $app_locale = app_locale();
        if ($app_locale == 'cn') {
            $locale = 'zh';
        }

        return self::getCountryList($countries, $locale);
    }

    public static function getCountryCallingCodeList(array $countries = null)
    {
//        $country_calling_code_list = self::$country_calling_codes;
        $country_calling_code_list = self::$nexmo_supported_country_calling_codes;

        if (empty($countries)) {
            return $country_calling_code_list;
        } else {
            return array_intersect_key($country_calling_code_list, array_flip($countries));
        }
    }

    public static function getCountryInfo($country_code = null)
    {
        if (empty($country_code)) {
            $country_code = self::getCurrentUserCountry();
        }

        $countryInfoList = self::getCountryInfoIndexedList();
        if (isset($countryInfoList[$country_code])) {
            return $countryInfoList[$country_code];
        } else {
            return;
        }
    }

    public static function getCountryInfoList()
    {
        $countryCallingCodeList = self::getCountryCallingCodeList();
        $country_iso_codes = array_keys($countryCallingCodeList);
        $country_list_en = self::getCountryList($country_iso_codes);
        $country_list_locale = self::getLocalizedCountryList($country_iso_codes);
        $country_info_list = [];
        foreach ($country_iso_codes as $country_iso_code) {
            $country_info = [];
            if (empty($country_list_en[$country_iso_code])
                || empty($country_list_locale[$country_iso_code])
            ) {
                continue;
            } else {
                $country_info['country_code'] = $country_iso_code;
                $country_info['name'] = $country_list_en[$country_iso_code];
                $country_info['locale_name'] = $country_list_locale[$country_iso_code];
                $country_info['calling_code'] = $countryCallingCodeList[$country_iso_code];
                $country_info_list[] = $country_info;
            }
        }

        return $country_info_list;
    }

    public static function getCountryInfoIndexedList()
    {
        $countryCallingCodeList = self::getCountryCallingCodeList();
        $country_iso_codes = array_keys($countryCallingCodeList);
        $country_list_en = self::getCountryList($country_iso_codes);
        $country_list_locale = self::getLocalizedCountryList($country_iso_codes);
        $country_info_list = [];
        foreach ($country_iso_codes as $country_iso_code) {
            $country_info = [];
            if (empty($country_list_en[$country_iso_code])
                || empty($country_list_locale[$country_iso_code])
            ) {
                continue;
            } else {
                $country_info['country_code'] = $country_iso_code;
                $country_info['name'] = $country_list_en[$country_iso_code];
                $country_info['locale_name'] = $country_list_locale[$country_iso_code];
                $country_info['calling_code'] = $countryCallingCodeList[$country_iso_code];
                $country_info_list[$country_iso_code] = $country_info;
            }
        }

        return $country_info_list;
    }

    public static function setCurrentUserCountry($country)
    {
        if (in_array($country, self::getCountryISOCodeList())) {
            \Session::put(self::CURRENT_USER_COUNTRY_KEY, $country);
        } else {
            \Log::warning("Invalid country [$country]");

            return false;
        }
    }

    public static function getCurrentUserCountry()
    {
        return \Session::get(self::CURRENT_USER_COUNTRY_KEY, self::$fallback_country);
    }

    /**
     * @return array
     */
    public static function getLocaleCallingCodes(): array
    {
        return self::$locale_calling_codes;
    }
}
